package com.wwm.springcloud.base.result;

import java.util.*;
import org.dom4j.*;

/**
 * Dom4j工具类
 *
 * @author wwm
 * @ClassName: Dom4jUtil
 * @date 2016年9月19日 下午2:41:52
 */
public class Dom4jUtil {
    /**
     * Xml转Map类型方法【通用方式】
     *
     * @param @param  xml
     * @param @return 参数
     * @return Map<String,Object> 返回类型
     * @Title: ele2Map
     */
    public static Map<String, Object> Xml2Map(String xml) throws Exception {
        Map<String, Object> rtnMap = new HashMap<String, Object>();
        try {
            Document document = DocumentHelper.parseText(xml);
            Element root = document.getRootElement();

            rtnMap = (Map<String, Object>) ele2Map(root);

        } catch (Exception e) {
            throw new Exception("报文解析失败，失败原因：" + e.getMessage());
        }
        return rtnMap;
    }

    public static Object ele2Map(Element element) {
        Map<String, Object> map = new HashMap<String, Object>();
        List<Element> elements = element.elements();
        if (elements.size() == 0) {
            map.put(element.getName(), element.getText());
            if (!element.isRootElement()) {
                return element.getText();
            }
        } else if (elements.size() == 1) {
            map.put(elements.get(0).getName(), ele2Map(elements.get(0)));
        } else if (elements.size() > 1) {
            // 多个子节点的话就得考虑list的情况了，比如多个子节点有节点名称相同的
            // 构造一个map用来去重
            Map<String, Element> tempMap = new HashMap<String, Element>();
            for (Element ele : elements) {
                tempMap.put(ele.getName(), ele);
            }
            Set<String> keySet = tempMap.keySet();
            for (String string : keySet) {
                Namespace namespace = tempMap.get(string).getNamespace();
                List<Element> elements2 = element.elements(new QName(string, namespace));
                // 如果同名的数目大于1则表示要构建list
                if (elements2.size() > 1) {
                    List<Object> list = new ArrayList<Object>();
                    for (Element ele : elements2) {
                        list.add(ele2Map(ele));
                    }
                    map.put(string, list);
                } else {
                    // 同名的数量不大于1则直接递归去
                    map.put(string, ele2Map(elements2.get(0)));
                }
            }
        }

        return map;
    }
}
